package chapter12_memModel;

//volatile 之所以在每个线程中是一样的，是因为每次使用volatile的时候会在主内存中取值刷新，volatile只能保证可见性
//volatile 取值是 （read load read） 赋值（assign store write）

public class P12_1 {
    public static volatile int count = 0;
    public static void increase(){
        /**
         * 此段代码出在此，字节码如下：
         * getstatic #13    //获取符号为13的变量 进栈
         * iconst_1         //int类型常量1进栈
         * iadd             //栈顶两个元素出栈相加，结果入栈
         * putstatic #13    //栈顶变量存储到符号为13的变量
         * return
         * 此处线程栈上的变量可能不是最新的，所以会有问题
         */
        count++;
    }
    private static int ThreadCount = 20;
    public static void main(String[] args) {
        Thread[] threads = new Thread[ThreadCount];
        for (Thread tread : threads) {
            tread = new Thread(()->{
                for (int i = 0; i < 1000; i++) {
                    increase();
                }
            });
            tread.start();
        }
        while (Thread.activeCount() > 1){
            Thread.yield();
        }
        System.out.println(count);
    }
}
